package service

import (
	"errors"
	"github.com/go-admin-team/go-admin-core/sdk/service"
	"tuowei.com/app/admin/models"
	"tuowei.com/app/admin/service/dto"
	"tuowei.com/common/actions"
	cDto "tuowei.com/common/dto"
	"tuowei.com/pkg/xlog"
)

type SysClass struct {
	service.Service
}

// GetPage 获取SysClass列表
func (e *SysClass) GetPage(c *dto.SysClassGetPageReq, p *actions.DataPermission, list *[]models.SysClass, count *int64) error {
	var err error
	var data models.SysClass
	err = e.Orm.Preload("Dept").
		Scopes(
			cDto.MakeCondition(c.GetNeedSearch()),
			cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
			actions.Permission(data.TableName(), p),
		).
		Find(list).Limit(-1).Offset(-1).
		Count(count).Error
	if err != nil {
		xlog.Errorf("db error: %s", err)
		return err
	}
	// 获取班级id
	classIds := make([]int, 0)
	for _, v := range *list {
		classIds = append(classIds, v.Id)
	}
	type result struct {
		ClassId int
		Total   int
	}
	m := make(map[int]int)
	if len(classIds) > 0 {

		rows, err := e.Orm.Model(models.SysStudent{}).Where("class_id in(?)", classIds).Select("class_id,count(1) as total ").Group("class_id").Rows()
		if err != nil {
			return err
		}
		defer rows.Close()
		for rows.Next() {
			var r result
			err = e.Orm.ScanRows(rows, &r)
			if err != nil {
				continue
			} else {
				m[r.ClassId] = r.Total
			}

		}
	}
	for k, v := range *list {
		(*list)[k].RealCount = m[v.Id]
	}
	return nil
}

// Insert 创建SysClass对象
func (e *SysClass) Insert(c *dto.SysClassInsertReq) (int, error) {
	var err error
	var data models.SysClass
	var i int64
	err = e.Orm.Model(&data).Where("name = ?", c.Name).Count(&i).Error
	if err != nil {
		e.Log.Errorf("db error: %s", err)
		return 0, err
	}
	if i > 0 {
		err := errors.New("班级已存在！")
		e.Log.Errorf("db error: %s", err)
		return 0, err
	}
	c.Generate(&data)
	if data.ClassType == "面授" && data.DeptId == 0 {
		err = errors.New("请选择教学点！")
		return 0, err
	}
	err = e.Orm.Create(&data).Error
	if err != nil {
		e.Log.Errorf("db error: %s", err)
		return 0, err
	}
	return data.Id, nil
}

func (e *SysClass) Update(c *dto.SysClassUpdateReq) error {
	var err error
	var model = models.SysClass{}
	var i int64
	err = e.Orm.Model(&model).Where("name = ?", c.Name).Where("id <> ?", c.Id).Count(&i).Error
	if err != nil {
		e.Log.Errorf("db error: %s", err)
		return err
	}
	if i > 0 {
		err = errors.New("班级已存在！")
		e.Log.Errorf("db error: %s", err)
		return err
	}
	e.Orm.First(&model, c.GetId())
	c.Generate(&model)
	if model.ClassType == "面授" && model.DeptId == 0 {
		err = errors.New("请选择教学点！")
		return err
	}
	db := e.Orm.Save(&model)
	err = db.Error
	if err != nil {
		e.Log.Errorf("Service UpdateStatus error:%s", err)
		return err
	}
	if db.RowsAffected == 0 {
		return errors.New("无权更新该数据")

	}
	return nil
}

// Remove 删除SysClass
func (e *SysClass) Remove(c *dto.SysClassById, p *actions.DataPermission) error {
	var err error
	var data models.SysClass

	db := e.Orm.Model(&data).
		Scopes(
			actions.Permission(data.TableName(), p),
		).Delete(&data, c.GetId())
	if err = db.Error; err != nil {
		e.Log.Errorf("Error found in  RemoveSysUser : %s", err)
		return err
	}
	if db.RowsAffected == 0 {
		return errors.New("无权删除该数据")
	}
	return nil
}

// GetPage 获取SysClass列表
func (e *SysClass) GetList(c *dto.SysClassSearchReq, list *[]models.SysClassList) error {
	var err error
	tx := e.Orm.Debug().
		Scopes(
			cDto.MakeCondition(c.GetNeedSearch()),
		).Table(new(models.SysClass).TableName()).Select("id,name")
	if c.ClassType != "" {
		tx = tx.Where("class_type = ?", c.ClassType)
	}
	err = tx.Find(list).Limit(-1).Offset(-1).Error
	if err != nil {
		e.Log.Errorf("db error: %s", err)
		return err
	}
	return nil
}

// DeleteClassStudent 删除班级学生
func (e *SysClass) DeleteClassStudent(classId int, ids []int) error {
	// 增加学生的时候
	// 检查是否真的未分班
	classIds := make([]int, 0)
	e.Orm.Model(models.SysStudent{}).Where("id in (?)", ids).Pluck("class_id", &classIds)
	for _, v := range classIds {
		if v != classId {
			return errors.New("有学员不是当前班级,请检查")
		}
	}
	// 直接移出班级
	e.Orm.Model(models.SysStudent{}).Where("id in (?)", ids).Where("class_id = ?", classId).Update("class_id", 0)
	return nil
}

// AddClassStudent 给你班级增加学生
func (e *SysClass) AddClassStudent(classId int, ids []int) error {
	// 增加学生的时候
	// 检查是否真的未分班
	classIds := make([]int, 0)
	e.Orm.Model(models.SysStudent{}).Where("id in (?)", ids).Pluck("class_id", &classIds)
	for _, v := range classIds {
		if v > 0 {
			return errors.New("有学员已经有班级了,请检查")
		}
	}
	// 直接移出班级
	e.Orm.Model(models.SysStudent{}).Where("id in (?)", ids).Update("class_id", classId)
	return nil
}
